/*
 * $Id$
 * @description article edit dialogs
 * 
 */

$.fn.extend({
    customizeEditor:function () {
        var dlg = $(this);
        $(".editor-area",dlg).ckeditor($().constants.customCKEditorOptions);
        return dlg;
    },
    getArticleList:function () {
        var dlg = $(this);
        $.post(
            "/json/article",
            function (data) {  //пришел ответ от сервера
                var container = $($("#article-container-class", dlg).val()); //найти див-контейнер статей
                var articleTemplate = $(".article-template", dlg);
                container.html(""); //очистить контейнер
                $.each(data, function (i, item) {
                    var article = dlg.createArticleFromTemplate(item.ent, articleTemplate);
                    article.appendTo(container);
                    $(".article-path", article).html(dlg.constructSitePathHyperLink(item.entityPath));
                });
                if ($("*", container).size() == 0) { //нет статей
                    var article = $(".article-no-articles").clone(). 
                    removeClass("article-no-articles").addClass("article-wrapper")
                    .appendTo(container); //если нет статей, показать сообщение об этом
                    /*
                    var article = articleTemplate.clone(). 
                    removeClass("article-template").addClass("article-wrapper")
                    .appendTo(container); //если нет статей добавить в список один пустой артикль
                    */
                }
                dlg.trigger("List.Article", data);
                dlg.trigger("List", data);
            },"json");
        return dlg;
    },
    getArticle:function (params) {
        var dlg = $(this);
        $.ajax({
            type: "POST",
            url: "/json/article",  
            data: params,
            success:function(data) {  //пришел ответ от сервера
                console.log(data);
                var editor = $(".editor-area",dlg).ckeditorGet();
                editor. setData(data.ent.content);
                editor.on("change",dlg.onChangeEditorContentListener);

                $("#edit-frm input:[name=artname]", dlg).val(data.ent.articleTitle);
                $("#edit-frm input:[name=arthid]", dlg).val(data.ent.ident);
                $("#edit-frm [name=catlist]",dlg).html("").append(
                    $("<option/>").attr("selected","selected")
                    .attr("value",data.entityPath[0].elKey).text(data.entityPath[0].elName) /*see EntityBase.getEntityPath()*/
                    ).attr("disabled","disabled"); //для существующих артиклей запретить смену иерархии из-за ограничений appengine JPA 
                $("#edit-frm [name=taglist]",dlg).html("").append(
                    $("<option/>").attr("selected","selected").attr("value",data.entityPath[1].elKey).text(data.entityPath[1].elName) 
                    ).attr("disabled","disabled");
                
                editor.resetDirty();
                dlg.markDirty("");
                
                dlg.trigger("Get.Article", data);
                dlg.trigger("Get", data);    
                                        
            },
            dataType: "json"
        });
        
        return dlg;
    },
    onChangeEditorContentListener:function(e){
        var dlg = $("#aticle-edit-dlg");
        dlg.markDirty("mark"); 
        //событие change в редакторе возникате слишком часто ( фактически мне нужен только первый факт изменения)
        //so, remove Listener
        $(".editor-area",dlg).ckeditorGet().removeListener("change",dlg.onChangeEditorContentListener);
        
        return dlg;
    },
    UIDArticle:function (params) {
        var dlg=$(this);
        $.ajax({
            type: "POST",
            url: "/json/article",  
            data: params,
            success:function (data) {
                console.log(data);
                dlg.trigger("UID.Article", data); // type.namespace
                dlg.trigger("UID", data);
            },
            dataType: "json"
        });
        return dlg;
    },
    createArticleFromTemplate:function (ent, articleTemplate) {
        var article = articleTemplate.clone().removeClass("article-template").addClass("article-wrapper");
        $(".article-title", article).html("").append($("<span/>").text(ent.articleTitle).attr("title","статья:"+ent.articleTitle));
        $(".article-text", article).html(ent.content);
        //   $(".article-date", article).text(ent.articleDate);
        $(".article-date", article).text(ent.ident+" created of "+ent.articleDate);
        $("input:[name=arthid]", article).val(ent.ident);
        $(".article-edit-tb button",article).each(function(i,item){
            var title=$(item).attr("title");
            $(item).attr("title", title+":"+ent.articleTitle);
        });
        return article;
    },
    
    doArticleEventHandle:function(event,data){
        var dlg = $(this);
        if (dlg.is("#aticle-edit-dlg")) {
            //    console.log(event.type+": "+event.namespace+": "+event.target);
            
            if (event.type=="List") {
                $(".article-edit-tb").fadeOut("slow");
            }
            
            if (event.type=="UID") {
                // if (data.Ok=="delete") {
                dlg.getArticleList();
                //  }
                if (data.Ok=="update"){
                    dlg.markDirty("");
                }
                if (data.Ok=="insert"){ //TODO: таже логика, что и при операции getArticle за исключением установки содержания и title статьи
                    dlg.markDirty("");
                    $("#edit-frm input:[name=arthid]", dlg).val(data.ent.ident);
                    $("#edit-frm [name=catlist]",dlg).html("").append(
                        $("<option/>").attr("selected","selected")
                        .attr("value",data.entityPath[0].elKey).text(data.entityPath[0].elName) /*see EntityBase.getEntityPath()*/
                        ).attr("disabled","disabled"); //для существующих артиклей запретить смену иерархии из-за ограничений appengine JPA 
                    $("#edit-frm [name=taglist]",dlg).html("").append(
                        $("<option/>").attr("selected","selected").attr("value",data.entityPath[1].elKey).text(data.entityPath[1].elName) 
                        ).attr("disabled","disabled");
                    $(".editor-area",dlg).ckeditorGet().on("change",dlg.onChangeEditorContentListener);  
                }
                
            }
            if (event.type=="Show") {  //on Show.Dialog -- article edit dialog
             
            }
            
            if (event.type=="Hide") {  //on Hide.Dialog -- remove editor's onchange listener 
                $(".editor-area",dlg).ckeditorGet().removeListener("change",dlg.onChangeEditorContentListener);
            }
            
            if (event.type=="Get") {  //on Get.Article -- показать диалог редактирования в случае удачной загрузки артикля
                dlg.showDialog();
            }
            
            if ((event.type=="change")&&(event.namespace=="catlist")) { 
                dlg.getTagList(event);
            }
        
            if ((event.type=="change")&&(event.namespace=="taglist")) { 
                            
            }
            
            if ((event.type=="change")&&(event.namespace=="artname")) { 
                dlg.markDirty("mark");
            }
            
        }
        
        return dlg;
    },
    markDirty:function(mark){
        dlg=$(this);
        var markInp=$("#edit-frm input:[name=dirtymark]",dlg);
        markInp.val(mark);     
        markInp.trigger("change.dirtymark");
        console.log("change.dirtymark:"+mark);
        if (mark) {
            $(".dlg-mark-change").show();
            $("#edit-frm [name=run]",dlg).removeAttr("disabled");
        } else {
            $(".dlg-mark-change").hide();
            $("#edit-frm [name=run]",dlg).attr("disabled", "disabled");
        }
        return dlg;
    },
    showArticleEditDialog:function (articleWrapper,event) {
        var dlg = $("#aticle-edit-dlg");

        if ($(event.target).is(".artilce-edit-link")){ 
            var articleKey = $("[name=arthid]", articleWrapper).val(); //найти ключ статьи в текущем article-wrapper
            $("#edit-frm [name=arthid]", dlg).val(articleKey); //выставить ключ статьи для диалога-редактора-статьи
            var params={
                "action":"get", //загрузить артикль
                "content":"yes",//получить полный текст статьи
                "akey":articleKey //выставить ключ статьи в параметрах 
            }
            console.log(params);
            dlg.getArticle(params);//показ диалога произойдет в случае удачного get
            
        } else if ($(event.target).is(".artilce-new-link")){ //создание новой статьи
            dlg.getCategoryList(event);
            dlg.showDialog();
            dlg.sanitizeArticleDialog();
        }
        return dlg;
    },
    sanitizeArticleDialog:function(){ /*sanitize  dialog*/
        dlg=$(this);
        $(":disabled",dlg).removeAttr("disabled");
        $("#edit-frm input:[name=artname]", dlg).val("");
        $("#edit-frm input:[name=arthid]", dlg).val("");
        var editor = $(".editor-area",dlg).ckeditorGet();
        editor. setData($(".article-template .article-text").html());
        editor.resetDirty();
        editor.on("change",dlg.onChangeEditorContentListener);
        dlg.markDirty("");
        return dlg;
    },
    constructSitePathHyperLink:function (entityPath) {
        var HRef = $().constants.SITE_PAGE;
        var caption = "";
        $.each(entityPath, function (i, item) {
            HRef = HRef + item.elKey + "/";
            if (caption) {
                caption = caption + "=>" + item.elName;
            } else {
                caption = caption +  item.elName;
            }
        });
        return $("<a/>").attr("href", HRef).text(caption);
    },
    setupArticleDlg:function (articlesListCssClass) {
        var dlg = $(this);

        $("#article-container-class", dlg).val(articlesListCssClass); //запомнить имя контейнера статей в скрытом поле

        $("form", dlg).append($("<input/>").attr("type", "hidden").attr("name", "arthid"));

        $("form", dlg).append($("<input/>").attr("type", "hidden").attr("name", "dirtymark"));
      
        
        
        $("#edit-frm [name=catlist]",dlg).change(function(){ //избежать мнгочисенных change в doArticleEventHandle
            $("#edit-frm [name=catlist]",dlg).trigger("change.catlist");
        })
        
        $("#edit-frm input:[name=artname]", dlg).on("change",function(){ //избежать мнгочисенных change в doArticleEventHandle
            //  console.log("change.artname");
            $("#edit-frm input:[name=artname]",dlg).trigger("change.artname");
        });

        
        $("#edit-frm [name=run]",dlg).click(function(){ 
            var editor=$(".editor-area",dlg).ckeditorGet();
            var params;
            if ($("#edit-frm input:[name=arthid]", dlg).val()) { //артикль есть в базе (имеется ключ)
                
                params={
                    "action":"upd",//обновляем
                    "akey":$("#edit-frm input:[name=arthid]", dlg).val(),
                    "atitle":$("#edit-frm input:[name=artname]", dlg).val()
                }
                if (editor.checkDirty()){
                    params.content=editor.getData();
                }
                dlg.UIDArticle(params);
            } else { //новый артикль
                params={
                    "action":"ins",//вставка
                    "atitle":$("#edit-frm input:[name=artname]", dlg).val(),
                    "seltag":$("#edit-frm [name=taglist] option:selected",dlg).text()
                }
                params.content=editor.getData();
                console.log(params);
                dlg.UIDArticle(params);
            }
        
        })
        
               
        $(".article-wrapper").live({ //live должен приклеивать обработчики к динамически создаваемым елементам (фактически live делегирует события на корень см. JQuery API)
            "click":function (e) {
                //  console.log(e.target);
               
                if ($(e.target).is(".artilce-edit-link")) {
                    e.preventDefault();
                    dlg.showArticleEditDialog(this,e);
                }
                if ($(e.target).is(".artilce-del-link")) {
                    e.preventDefault();
                    var params = {
                        "action":"del",
                        "akey":$("[name=arthid]", this).val()
                    };
                    dlg.UIDArticle(params);
                }
            },
            "mouseenter mouseleave":function (e) {
                if (e.type == "mouseenter") {
                    $(".article-edit-tb", this).show();
                    $(this).addClass("mouseovered");
                } else if (e.type == "mouseleave") {
                    $(".article-edit-tb", this).hide();
                    $(this).removeClass("mouseovered");
                }
            }
        });
        
        $(".artilce-new-link").click(function(e){ //ссылка(или кнопка) "создание статьи" может быть вне пределов ".article-wrapper" 
            e.preventDefault();
            dlg.showArticleEditDialog(null,e); 
            
        });
        return dlg;
    },
    ArticleEditDialog:function (articlesListCssClass /* имя контейнера статей*/) {
        var priority = 3;
        var dlg = $("#aticle-edit-dlg").ModalDialog(""/*не привязывать запуск*/, priority)
        .setupArticleDlg(articlesListCssClass).customizeEditor();

        dlg.on({
            "List.Article":dlg.doArticleEventHandle,
            "UID.Article":dlg.doArticleEventHandle,
            "Get.Article":dlg.doArticleEventHandle,
            "change.catlist":dlg.doArticleEventHandle,
            "change.taglist":dlg.doArticleEventHandle,
            "change.artname":dlg.doArticleEventHandle,
            "Show.Dialog":dlg.doArticleEventHandle,
            "Hide.Dialog":dlg.doArticleEventHandle
            
        });
        dlg.getArticleList();

        return dlg;
    }
});

